﻿// RankingSejmowy 1.0 - Polish parliment statistics for the masses.
// Copyright (C) 2010 Jarosław Dubrownik
//  
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//  
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//  
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
using System.Collections.Generic;
using HtmlAgilityPack;
using RankingSejmowy.Common.Exceptions;
using RankingSejmowy.Common.Extensions;
using RankingSejmowy.Model;
using RankingSejmowy.Model.Import;

namespace RankingSejmowy.BLL.Import.Parser.PageParsers
{
    public class AgilityMeetingParser : IMeetingParser
    {
        private const string MEETING_TITLE_PATTERN =
            @"(?'date'\d{2}-\d{2}-\d{4}).+?(?'number'\d+)";

        #region IMeetingParser Members

        public void Parse(IEnumerable<SiteMapPage> meetingPages, Cadence cadence, IParserFactory parserFactory)
        {
            foreach (var meetingPage in meetingPages)
            {
                ParseMeeting(meetingPage, cadence, parserFactory);
            }
        }

        #endregion

        private void ParseMeeting(SiteMapPage meetingPage, Cadence cadence, IParserFactory parserFactory)
        {
            var doc = new HtmlDocument();
            doc.Load(meetingPage.DownloadedPage.LocalFile, meetingPage.DownloadedPage.Encoding);
            var node = doc.DocumentNode.SelectSingleNode("//td[@class='naz']/b/text()");
            if (node == null)
            {
                throw new ParseException(string.Format("meeting page ({0})", meetingPage.Uri));
            }

            var match = node.InnerText.Match(MEETING_TITLE_PATTERN);
            if (!match.Success)
            {
                throw new ParseException(string.Format("meeting title not match ({0})", meetingPage.Uri));
            }

            var meetingDate = match.Groups["date"].Value.ConvertToDateTime("dd-MM-yyyy");
            var meetingNumber = match.Groups["number"].Value.ConvertTo<int>();
            var meeting = new Meeting
                              {
                                  Date = meetingDate,
                                  MeetingNum = meetingNumber
                              };
            var parser = parserFactory.CreateVotingParser();
            cadence.AddMeeting(meeting);
            parser.Parse(meetingPage.SubPages, meeting, parserFactory);
        }
    }
}